{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 案例介绍"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "案例数据来源于江苏镇江扬中市的高新区企业历史近2年的用电量，希望能够根据历史数据去精准预测未来一个月每一天的用电量，这是一个很典型的时序数据回归类问题，我们来看看如何用数据驱动的建模方法去完成这样一个预测。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. 数据理解"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on function concat in module pandas.core.reshape.concat:\n",
      "\n",
      "concat(objs: Union[Iterable[Union[ForwardRef('DataFrame'), ForwardRef('Series')]], Mapping[Union[Hashable, NoneType], Union[ForwardRef('DataFrame'), ForwardRef('Series')]]], axis=0, join='outer', ignore_index: bool = False, keys=None, levels=None, names=None, verify_integrity: bool = False, sort: bool = False, copy: bool = True) -> Union[ForwardRef('DataFrame'), ForwardRef('Series')]\n",
      "    Concatenate pandas objects along a particular axis with optional set logic\n",
      "    along the other axes.\n",
      "    \n",
      "    Can also add a layer of hierarchical indexing on the concatenation axis,\n",
      "    which may be useful if the labels are the same (or overlapping) on\n",
      "    the passed axis number.\n",
      "    \n",
      "    Parameters\n",
      "    ----------\n",
      "    objs : a sequence or mapping of Series or DataFrame objects\n",
      "        If a dict is passed, the sorted keys will be used as the `keys`\n",
      "        argument, unless it is passed, in which case the values will be\n",
      "        selected (see below). Any None objects will be dropped silently unless\n",
      "        they are all None in which case a ValueError will be raised.\n",
      "    axis : {0/'index', 1/'columns'}, default 0\n",
      "        The axis to concatenate along.\n",
      "    join : {'inner', 'outer'}, default 'outer'\n",
      "        How to handle indexes on other axis (or axes).\n",
      "    ignore_index : bool, default False\n",
      "        If True, do not use the index values along the concatenation axis. The\n",
      "        resulting axis will be labeled 0, ..., n - 1. This is useful if you are\n",
      "        concatenating objects where the concatenation axis does not have\n",
      "        meaningful indexing information. Note the index values on the other\n",
      "        axes are still respected in the join.\n",
      "    keys : sequence, default None\n",
      "        If multiple levels passed, should contain tuples. Construct\n",
      "        hierarchical index using the passed keys as the outermost level.\n",
      "    levels : list of sequences, default None\n",
      "        Specific levels (unique values) to use for constructing a\n",
      "        MultiIndex. Otherwise they will be inferred from the keys.\n",
      "    names : list, default None\n",
      "        Names for the levels in the resulting hierarchical index.\n",
      "    verify_integrity : bool, default False\n",
      "        Check whether the new concatenated axis contains duplicates. This can\n",
      "        be very expensive relative to the actual data concatenation.\n",
      "    sort : bool, default False\n",
      "        Sort non-concatenation axis if it is not already aligned when `join`\n",
      "        is 'outer'.\n",
      "        This has no effect when ``join='inner'``, which already preserves\n",
      "        the order of the non-concatenation axis.\n",
      "    \n",
      "        .. versionadded:: 0.23.0\n",
      "        .. versionchanged:: 1.0.0\n",
      "    \n",
      "           Changed to not sort by default.\n",
      "    \n",
      "    copy : bool, default True\n",
      "        If False, do not copy data unnecessarily.\n",
      "    \n",
      "    Returns\n",
      "    -------\n",
      "    object, type of objs\n",
      "        When concatenating all ``Series`` along the index (axis=0), a\n",
      "        ``Series`` is returned. When ``objs`` contains at least one\n",
      "        ``DataFrame``, a ``DataFrame`` is returned. When concatenating along\n",
      "        the columns (axis=1), a ``DataFrame`` is returned.\n",
      "    \n",
      "    See Also\n",
      "    --------\n",
      "    Series.append : Concatenate Series.\n",
      "    DataFrame.append : Concatenate DataFrames.\n",
      "    DataFrame.join : Join DataFrames using indexes.\n",
      "    DataFrame.merge : Merge DataFrames by indexes or columns.\n",
      "    \n",
      "    Notes\n",
      "    -----\n",
      "    The keys, levels, and names arguments are all optional.\n",
      "    \n",
      "    A walkthrough of how this method fits in with other tools for combining\n",
      "    pandas objects can be found `here\n",
      "    <https://pandas.pydata.org/pandas-docs/stable/user_guide/merging.html>`__.\n",
      "    \n",
      "    Examples\n",
      "    --------\n",
      "    Combine two ``Series``.\n",
      "    \n",
      "    >>> s1 = pd.Series(['a', 'b'])\n",
      "    >>> s2 = pd.Series(['c', 'd'])\n",
      "    >>> pd.concat([s1, s2])\n",
      "    0    a\n",
      "    1    b\n",
      "    0    c\n",
      "    1    d\n",
      "    dtype: object\n",
      "    \n",
      "    Clear the existing index and reset it in the result\n",
      "    by setting the ``ignore_index`` option to ``True``.\n",
      "    \n",
      "    >>> pd.concat([s1, s2], ignore_index=True)\n",
      "    0    a\n",
      "    1    b\n",
      "    2    c\n",
      "    3    d\n",
      "    dtype: object\n",
      "    \n",
      "    Add a hierarchical index at the outermost level of\n",
      "    the data with the ``keys`` option.\n",
      "    \n",
      "    >>> pd.concat([s1, s2], keys=['s1', 's2'])\n",
      "    s1  0    a\n",
      "        1    b\n",
      "    s2  0    c\n",
      "        1    d\n",
      "    dtype: object\n",
      "    \n",
      "    Label the index keys you create with the ``names`` option.\n",
      "    \n",
      "    >>> pd.concat([s1, s2], keys=['s1', 's2'],\n",
      "    ...           names=['Series name', 'Row ID'])\n",
      "    Series name  Row ID\n",
      "    s1           0         a\n",
      "                 1         b\n",
      "    s2           0         c\n",
      "                 1         d\n",
      "    dtype: object\n",
      "    \n",
      "    Combine two ``DataFrame`` objects with identical columns.\n",
      "    \n",
      "    >>> df1 = pd.DataFrame([['a', 1], ['b', 2]],\n",
      "    ...                    columns=['letter', 'number'])\n",
      "    >>> df1\n",
      "      letter  number\n",
      "    0      a       1\n",
      "    1      b       2\n",
      "    >>> df2 = pd.DataFrame([['c', 3], ['d', 4]],\n",
      "    ...                    columns=['letter', 'number'])\n",
      "    >>> df2\n",
      "      letter  number\n",
      "    0      c       3\n",
      "    1      d       4\n",
      "    >>> pd.concat([df1, df2])\n",
      "      letter  number\n",
      "    0      a       1\n",
      "    1      b       2\n",
      "    0      c       3\n",
      "    1      d       4\n",
      "    \n",
      "    Combine ``DataFrame`` objects with overlapping columns\n",
      "    and return everything. Columns outside the intersection will\n",
      "    be filled with ``NaN`` values.\n",
      "    \n",
      "    >>> df3 = pd.DataFrame([['c', 3, 'cat'], ['d', 4, 'dog']],\n",
      "    ...                    columns=['letter', 'number', 'animal'])\n",
      "    >>> df3\n",
      "      letter  number animal\n",
      "    0      c       3    cat\n",
      "    1      d       4    dog\n",
      "    >>> pd.concat([df1, df3], sort=False)\n",
      "      letter  number animal\n",
      "    0      a       1    NaN\n",
      "    1      b       2    NaN\n",
      "    0      c       3    cat\n",
      "    1      d       4    dog\n",
      "    \n",
      "    Combine ``DataFrame`` objects with overlapping columns\n",
      "    and return only those that are shared by passing ``inner`` to\n",
      "    the ``join`` keyword argument.\n",
      "    \n",
      "    >>> pd.concat([df1, df3], join=\"inner\")\n",
      "      letter  number\n",
      "    0      a       1\n",
      "    1      b       2\n",
      "    0      c       3\n",
      "    1      d       4\n",
      "    \n",
      "    Combine ``DataFrame`` objects horizontally along the x axis by\n",
      "    passing in ``axis=1``.\n",
      "    \n",
      "    >>> df4 = pd.DataFrame([['bird', 'polly'], ['monkey', 'george']],\n",
      "    ...                    columns=['animal', 'name'])\n",
      "    >>> pd.concat([df1, df4], axis=1)\n",
      "      letter  number  animal    name\n",
      "    0      a       1    bird   polly\n",
      "    1      b       2  monkey  george\n",
      "    \n",
      "    Prevent the result from including duplicate index values with the\n",
      "    ``verify_integrity`` option.\n",
      "    \n",
      "    >>> df5 = pd.DataFrame([1], index=['a'])\n",
      "    >>> df5\n",
      "       0\n",
      "    a  1\n",
      "    >>> df6 = pd.DataFrame([2], index=['a'])\n",
      "    >>> df6\n",
      "       0\n",
      "    a  2\n",
      "    >>> pd.concat([df5, df6], verify_integrity=True)\n",
      "    Traceback (most recent call last):\n",
      "        ...\n",
      "    ValueError: Indexes have overlapping values: ['a']\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(pd.concat)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>record_date</th>\n",
       "      <th>power_consumption</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>2015-01-01</td>\n",
       "      <td>1135.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>2015-01-02</td>\n",
       "      <td>570.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>2015-01-03</td>\n",
       "      <td>3418.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>2015-01-04</td>\n",
       "      <td>3968.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>2015-01-05</td>\n",
       "      <td>3986.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id record_date  power_consumption\n",
       "0        1  2015-01-01             1135.0\n",
       "1        1  2015-01-02              570.0\n",
       "2        1  2015-01-03             3418.0\n",
       "3        1  2015-01-04             3968.0\n",
       "4        1  2015-01-05             3986.0"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_1 = pd.read_csv('./input/zhenjiang_power.csv')\n",
    "data_2 = pd.read_csv('./input/zhenjiang_power_9.csv')\n",
    "data = pd.concat([data_1, data_2])\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 929106 entries, 0 to 43619\n",
      "Data columns (total 3 columns):\n",
      " #   Column             Non-Null Count   Dtype  \n",
      "---  ------             --------------   -----  \n",
      " 0   user_id            929106 non-null  int64  \n",
      " 1   record_date        929106 non-null  object \n",
      " 2   power_consumption  929106 non-null  float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 28.4+ MB\n"
     ]
    }
   ],
   "source": [
    "data.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>power_consumption</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>929106.000000</td>\n",
       "      <td>9.291060e+05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>727.500000</td>\n",
       "      <td>2.617557e+03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>419.733772</td>\n",
       "      <td>3.141672e+04</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000e+00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>364.000000</td>\n",
       "      <td>4.400000e+01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>727.500000</td>\n",
       "      <td>2.630000e+02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>1091.000000</td>\n",
       "      <td>8.280000e+02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>1454.000000</td>\n",
       "      <td>1.310016e+06</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             user_id  power_consumption\n",
       "count  929106.000000       9.291060e+05\n",
       "mean      727.500000       2.617557e+03\n",
       "std       419.733772       3.141672e+04\n",
       "min         1.000000       1.000000e+00\n",
       "25%       364.000000       4.400000e+01\n",
       "50%       727.500000       2.630000e+02\n",
       "75%      1091.000000       8.280000e+02\n",
       "max      1454.000000       1.310016e+06"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1454"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看企业数量\n",
    "len(data['user_id'].unique())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 929106 entries, 0 to 43619\n",
      "Data columns (total 3 columns):\n",
      " #   Column             Non-Null Count   Dtype         \n",
      "---  ------             --------------   -----         \n",
      " 0   user_id            929106 non-null  int64         \n",
      " 1   record_date        929106 non-null  datetime64[ns]\n",
      " 2   power_consumption  929106 non-null  float64       \n",
      "dtypes: datetime64[ns](1), float64(1), int64(1)\n",
      "memory usage: 28.4 MB\n"
     ]
    }
   ],
   "source": [
    "data.loc[:, 'record_date'] = pd.to_datetime(data['record_date'])\n",
    "data.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>power_consumption</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>record_date</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2015-01-01</th>\n",
       "      <td>2900575.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2015-01-02</th>\n",
       "      <td>3158211.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2015-01-03</th>\n",
       "      <td>3596487.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2015-01-04</th>\n",
       "      <td>3939672.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2015-01-05</th>\n",
       "      <td>4101790.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             power_consumption\n",
       "record_date                   \n",
       "2015-01-01           2900575.0\n",
       "2015-01-02           3158211.0\n",
       "2015-01-03           3596487.0\n",
       "2015-01-04           3939672.0\n",
       "2015-01-05           4101790.0"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 计算地区每天的用电量\n",
    "data = data[['record_date', 'power_consumption']].groupby('record_date').agg('sum')\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>record_date</th>\n",
       "      <th>power_consumption</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2015-01-01</td>\n",
       "      <td>2900575.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2015-01-02</td>\n",
       "      <td>3158211.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2015-01-03</td>\n",
       "      <td>3596487.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2015-01-04</td>\n",
       "      <td>3939672.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2015-01-05</td>\n",
       "      <td>4101790.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  record_date  power_consumption\n",
       "0  2015-01-01          2900575.0\n",
       "1  2015-01-02          3158211.0\n",
       "2  2015-01-03          3596487.0\n",
       "3  2015-01-04          3939672.0\n",
       "4  2015-01-05          4101790.0"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = data.reset_index()\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x1fb930c2e50>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "tmp_data = data[(data['record_date'] >= '2015-09-01') & (data['record_date'] <= '2015-10-31')]\n",
    "tmp_data = tmp_data.set_index(['record_date'])\n",
    "tmp_data['power_consumption'].plot()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "数据分析：企业用电率受节假日、周末、季度以及新增企业数量等因素影响，因此需要从以下角度去进行特征构造"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. 构造测试集数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2016-10-01', '2016-10-02', '2016-10-03', '2016-10-04',\n",
       "               '2016-10-05', '2016-10-06', '2016-10-07', '2016-10-08',\n",
       "               '2016-10-09', '2016-10-10', '2016-10-11', '2016-10-12',\n",
       "               '2016-10-13', '2016-10-14', '2016-10-15', '2016-10-16',\n",
       "               '2016-10-17', '2016-10-18', '2016-10-19', '2016-10-20',\n",
       "               '2016-10-21', '2016-10-22', '2016-10-23', '2016-10-24',\n",
       "               '2016-10-25', '2016-10-26', '2016-10-27', '2016-10-28',\n",
       "               '2016-10-29', '2016-10-30', '2016-10-31'],\n",
       "              dtype='datetime64[ns]', freq='D')"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_df = pd.date_range('2016-10-01', periods=31, freq='D')\n",
    "test_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>record_date</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2016-10-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2016-10-02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2016-10-03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2016-10-04</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2016-10-05</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  record_date\n",
       "0  2016-10-01\n",
       "1  2016-10-02\n",
       "2  2016-10-03\n",
       "3  2016-10-04\n",
       "4  2016-10-05"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_df = pd.DataFrame(test_df)\n",
    "test_df.columns = ['record_date']\n",
    "test_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>record_date</th>\n",
       "      <th>power_consumption</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2016-10-01</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2016-10-02</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2016-10-03</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2016-10-04</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2016-10-05</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  record_date  power_consumption\n",
       "0  2016-10-01                  0\n",
       "1  2016-10-02                  0\n",
       "2  2016-10-03                  0\n",
       "3  2016-10-04                  0\n",
       "4  2016-10-05                  0"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_df.loc[:, 'power_consumption'] = 0\n",
    "test_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>record_date</th>\n",
       "      <th>power_consumption</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>2016-10-27</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>2016-10-28</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>2016-10-29</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>2016-10-30</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>2016-10-31</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   record_date  power_consumption\n",
       "26  2016-10-27                0.0\n",
       "27  2016-10-28                0.0\n",
       "28  2016-10-29                0.0\n",
       "29  2016-10-30                0.0\n",
       "30  2016-10-31                0.0"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 拼接到一起做特征工程\n",
    "total_df = pd.concat([data, test_df])\n",
    "total_df.tail()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. 构造时间特征"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "构造一些强时间特征：\n",
    "- 是否是周六日\n",
    "- 是否是法定节假日\n",
    "- 一年中的第几个月\n",
    "- 一年中的第几周\n",
    "- 一周中的星期几\n",
    "- 一月中的上、中、下旬"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>record_date</th>\n",
       "      <th>power_consumption</th>\n",
       "      <th>dayofweek</th>\n",
       "      <th>month</th>\n",
       "      <th>dayofmonth</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2015-01-01</td>\n",
       "      <td>2900575.0</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2015-01-02</td>\n",
       "      <td>3158211.0</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2015-01-03</td>\n",
       "      <td>3596487.0</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2015-01-04</td>\n",
       "      <td>3939672.0</td>\n",
       "      <td>6</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2015-01-05</td>\n",
       "      <td>4101790.0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  record_date  power_consumption  dayofweek  month  dayofmonth\n",
       "0  2015-01-01          2900575.0          3      1           1\n",
       "1  2015-01-02          3158211.0          4      1           2\n",
       "2  2015-01-03          3596487.0          5      1           3\n",
       "3  2015-01-04          3939672.0          6      1           4\n",
       "4  2015-01-05          4101790.0          0      1           5"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "total_df.loc[:, 'dayofweek'] = total_df['record_date'].apply(lambda x:x.dayofweek)\n",
    "total_df.loc[:, 'month'] = total_df['record_date'].apply(lambda x:x.month)\n",
    "total_df.loc[:, 'dayofmonth'] = total_df['record_date'].apply(lambda x:x.day)\n",
    "total_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 构造周末特征\n",
    "total_df.loc[:, 'weekend_sat'] = 0\n",
    "total_df.loc[:, 'weekend_sun'] = 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "total_df.loc[total_df['dayofweek']==5, 'weekend_sat'] = 1\n",
    "total_df.loc[total_df['dayofweek']==6, 'weekend_sun'] = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 构造上中下旬\n",
    "def period_of_month(day):\n",
    "    if day in range(1, 11):\n",
    "        return 1\n",
    "    if day in range(11, 21):\n",
    "        return 2\n",
    "    else:\n",
    "        return 3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>record_date</th>\n",
       "      <th>power_consumption</th>\n",
       "      <th>dayofweek</th>\n",
       "      <th>month</th>\n",
       "      <th>dayofmonth</th>\n",
       "      <th>weekend_sat</th>\n",
       "      <th>weekend_sun</th>\n",
       "      <th>period_of_month</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2015-01-01</td>\n",
       "      <td>2900575.0</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2015-01-02</td>\n",
       "      <td>3158211.0</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2015-01-03</td>\n",
       "      <td>3596487.0</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2015-01-04</td>\n",
       "      <td>3939672.0</td>\n",
       "      <td>6</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2015-01-05</td>\n",
       "      <td>4101790.0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  record_date  power_consumption  dayofweek  month  dayofmonth  weekend_sat  \\\n",
       "0  2015-01-01          2900575.0          3      1           1            0   \n",
       "1  2015-01-02          3158211.0          4      1           2            0   \n",
       "2  2015-01-03          3596487.0          5      1           3            1   \n",
       "3  2015-01-04          3939672.0          6      1           4            1   \n",
       "4  2015-01-05          4101790.0          0      1           5            0   \n",
       "\n",
       "   weekend_sun  period_of_month  \n",
       "0            0                1  \n",
       "1            0                1  \n",
       "2            0                1  \n",
       "3            0                1  \n",
       "4            0                1  "
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "total_df.loc[:, 'period_of_month'] = total_df['dayofmonth'].apply(lambda x:period_of_month(x))\n",
    "total_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 构造一个月的第几周\n",
    "def period_of_week(day):\n",
    "    if day in range(1, 8):\n",
    "        return 1\n",
    "    if day in range(8, 15):\n",
    "        return 2\n",
    "    if day in range(15, 22):\n",
    "        return 3\n",
    "    else:\n",
    "        return 4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>record_date</th>\n",
       "      <th>power_consumption</th>\n",
       "      <th>dayofweek</th>\n",
       "      <th>month</th>\n",
       "      <th>dayofmonth</th>\n",
       "      <th>weekend_sat</th>\n",
       "      <th>weekend_sun</th>\n",
       "      <th>period_of_month</th>\n",
       "      <th>period_of_week</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2015-01-01</td>\n",
       "      <td>2900575.0</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2015-01-02</td>\n",
       "      <td>3158211.0</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2015-01-03</td>\n",
       "      <td>3596487.0</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2015-01-04</td>\n",
       "      <td>3939672.0</td>\n",
       "      <td>6</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2015-01-05</td>\n",
       "      <td>4101790.0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  record_date  power_consumption  dayofweek  month  dayofmonth  weekend_sat  \\\n",
       "0  2015-01-01          2900575.0          3      1           1            0   \n",
       "1  2015-01-02          3158211.0          4      1           2            0   \n",
       "2  2015-01-03          3596487.0          5      1           3            1   \n",
       "3  2015-01-04          3939672.0          6      1           4            1   \n",
       "4  2015-01-05          4101790.0          0      1           5            0   \n",
       "\n",
       "   weekend_sun  period_of_month  period_of_week  \n",
       "0            0                1               1  \n",
       "1            0                1               1  \n",
       "2            0                1               1  \n",
       "3            0                1               1  \n",
       "4            0                1               1  "
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "total_df.loc[:, 'period_of_week'] = total_df['dayofmonth'].apply(lambda x:period_of_week(x))\n",
    "total_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>record_date</th>\n",
       "      <th>power_consumption</th>\n",
       "      <th>dayofweek</th>\n",
       "      <th>month</th>\n",
       "      <th>dayofmonth</th>\n",
       "      <th>weekend_sat</th>\n",
       "      <th>weekend_sun</th>\n",
       "      <th>period_of_month</th>\n",
       "      <th>period_of_week</th>\n",
       "      <th>festival</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2015-01-01</td>\n",
       "      <td>2900575.0</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2015-01-02</td>\n",
       "      <td>3158211.0</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2015-01-03</td>\n",
       "      <td>3596487.0</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2015-01-04</td>\n",
       "      <td>3939672.0</td>\n",
       "      <td>6</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2015-01-05</td>\n",
       "      <td>4101790.0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  record_date  power_consumption  dayofweek  month  dayofmonth  weekend_sat  \\\n",
       "0  2015-01-01          2900575.0          3      1           1            0   \n",
       "1  2015-01-02          3158211.0          4      1           2            0   \n",
       "2  2015-01-03          3596487.0          5      1           3            1   \n",
       "3  2015-01-04          3939672.0          6      1           4            1   \n",
       "4  2015-01-05          4101790.0          0      1           5            0   \n",
       "\n",
       "   weekend_sun  period_of_month  period_of_week  festival  \n",
       "0            0                1               1         0  \n",
       "1            0                1               1         0  \n",
       "2            0                1               1         0  \n",
       "3            0                1               1         0  \n",
       "4            0                1               1         0  "
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 填充法定节假日 - 国庆\n",
    "total_df.loc[:, 'festival'] = 0\n",
    "total_df.loc[(total_df['month']==10) & (total_df['dayofmonth']<8), 'festival'] = 1\n",
    "total_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.独热向量编码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['record_date', 'power_consumption', 'weekend_sat', 'weekend_sun',\n",
       "       'festival', 'dayofweek_0', 'dayofweek_1', 'dayofweek_2', 'dayofweek_3',\n",
       "       'dayofweek_4', 'dayofweek_5', 'dayofweek_6', 'month_1', 'month_2',\n",
       "       'month_3', 'month_4', 'month_5', 'month_6', 'month_7', 'month_8',\n",
       "       'month_9', 'month_10', 'month_11', 'month_12', 'dayofmonth_1',\n",
       "       'dayofmonth_2', 'dayofmonth_3', 'dayofmonth_4', 'dayofmonth_5',\n",
       "       'dayofmonth_6', 'dayofmonth_7', 'dayofmonth_8', 'dayofmonth_9',\n",
       "       'dayofmonth_10', 'dayofmonth_11', 'dayofmonth_12', 'dayofmonth_13',\n",
       "       'dayofmonth_14', 'dayofmonth_15', 'dayofmonth_16', 'dayofmonth_17',\n",
       "       'dayofmonth_18', 'dayofmonth_19', 'dayofmonth_20', 'dayofmonth_21',\n",
       "       'dayofmonth_22', 'dayofmonth_23', 'dayofmonth_24', 'dayofmonth_25',\n",
       "       'dayofmonth_26', 'dayofmonth_27', 'dayofmonth_28', 'dayofmonth_29',\n",
       "       'dayofmonth_30', 'dayofmonth_31', 'period_of_month_1',\n",
       "       'period_of_month_2', 'period_of_month_3', 'period_of_week_1',\n",
       "       'period_of_week_2', 'period_of_week_3', 'period_of_week_4'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dummy_df = pd.get_dummies(total_df, columns=['dayofweek', 'month', 'dayofmonth', 'period_of_month', 'period_of_week'])\n",
    "dummy_df.columns"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5.分离训练集和测试集"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "每天的总用电量 power_consumption 作为标签值，其余字段除了 record_date 外作为特征值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_X = dummy_df[dummy_df.record_date < '2016-10-01']\n",
    "train_y = dummy_df[dummy_df.record_date < '2016-10-01']['power_consumption']\n",
    "test_X = dummy_df[dummy_df.record_date >= '2016-10-01']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 删除训练集和测试集中的 record_date 和 power_consumption 字段\n",
    "drop_col = ['record_date', 'power_consumption']\n",
    "train_X = train_X.drop(columns=drop_col, axis=1)\n",
    "test_X = test_X.drop(columns=drop_col, axis=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6.线性模型建模"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 引入岭回归模型\n",
    "from sklearn.linear_model import RidgeCV\n",
    "# alphas：正则项系数，cv=5 表示5折交叉验证\n",
    "line_model = RidgeCV(alphas=[0.2, 0.4, 0.6, 0.8], cv=5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "RidgeCV(alphas=array([0.2, 0.4, 0.6, 0.8]), cv=5)"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 模型训练\n",
    "line_model.fit(train_X, train_y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.4949184064459319"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 模型拟合效果得分\n",
    "line_model.score(train_X, train_y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 7.模型预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([3003057.36454616, 2913614.74236983, 3277654.53150985,\n",
       "       3338847.62145769, 3272580.0413547 , 3315617.19245061,\n",
       "       3344221.13776174, 3613206.85007173, 3437968.33339999,\n",
       "       3710439.3840079 , 3754379.64492216, 3784391.78958981,\n",
       "       3762074.90398847, 3756041.30342805, 3565013.99613661,\n",
       "       3448460.38772175, 3739863.27319204, 3802515.95029585,\n",
       "       3807426.87936717, 3708012.49376583, 3739952.54049333,\n",
       "       3685444.73777083, 3560063.60642019, 3837253.87721159,\n",
       "       3866625.6368842 , 3865102.57512983, 3865392.89136336,\n",
       "       3745588.05227082, 3753059.23565559, 3524811.49564215,\n",
       "       3704511.02630723])"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "predictions = line_model.predict(test_X)\n",
    "predictions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>record_date</th>\n",
       "      <th>power_consumption</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2016-10-01</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2016-10-02</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2016-10-03</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2016-10-04</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2016-10-05</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  record_date  power_consumption\n",
       "0  2016-10-01                  0\n",
       "1  2016-10-02                  0\n",
       "2  2016-10-03                  0\n",
       "3  2016-10-04                  0\n",
       "4  2016-10-05                  0"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>record_date</th>\n",
       "      <th>power_consumption</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2016-10-01</td>\n",
       "      <td>3.003057e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2016-10-02</td>\n",
       "      <td>2.913615e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2016-10-03</td>\n",
       "      <td>3.277655e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2016-10-04</td>\n",
       "      <td>3.338848e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2016-10-05</td>\n",
       "      <td>3.272580e+06</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  record_date  power_consumption\n",
       "0  2016-10-01       3.003057e+06\n",
       "1  2016-10-02       2.913615e+06\n",
       "2  2016-10-03       3.277655e+06\n",
       "3  2016-10-04       3.338848e+06\n",
       "4  2016-10-05       3.272580e+06"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_df.loc[:, 'power_consumption'] = predictions\n",
    "test_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 8.生成CSV文件，提交工程"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [],
   "source": [
    "test_df.to_csv('line_prediction.csv', index=None)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 9.其他模型的预测评分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-0.034710759631810584"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.svm import SVR\n",
    "svm_reg = SVR(C=1.0, epsilon=0.2)\n",
    "svm_reg.fit(train_X, train_y)\n",
    "svm_reg.score(train_X, train_y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
